#include <bits/stdc++.h>
using namespace std;

// 邻接表：g[u]存储从u出发的所有边(目标节点v, 边权重w)
vector<pair<int, int>> g[200000];
// 存储起点到每个节点的最短距离
int dist[200000];
// 标记节点是否已访问
int vis[200000];

int main() {
  int n, m, s, t;
  cin >> n >> m >> s >> t;

  // 构建邻接表
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }

  // 优先队列存储(负距离, 节点编号)
  priority_queue<pair<int, int>> q;

  // 初始化距离为无穷大
  memset(dist, 0x3f, sizeof(dist));

  // 起点设置
  q.push({0, s});
  dist[s] = 0;

  // Dijkstra算法
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();

    // 跳过已处理节点
    if (vis[u])
      continue;

    vis[u] = 1;

    // 遍历邻居节点
    for (auto edge : g[u]) {
      int v = edge.first;
      int w = edge.second;

      // 松弛操作
      if (dist[u] + w < dist[v]) {
        dist[v] = dist[u] + w;
        q.push({-dist[v], v});
      }
    }
  }

  // 输出结果
  cout << dist[t];
  return 0;
}